package com.kehong.dbcp;

import org.apache.commons.dbcp.BasicDataSource;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author zhang peng yang ming
 * @CopyRight (C) http://www.csdn.com
 * @brief 数据库连接池数据源信息初始化类
 * @email 122162005@qq.com
 * @date 2018-07-12
 */
public class ConnectionSource {
    // 数据库连接池资源
    private static BasicDataSource dataSource;

    /**
     * 初始化数据库配置以及连接池的配置
     */
    private static void init(){
        Properties properties = new Properties();
        try {

            properties.load(ConnectionSource.class.getClassLoader().getResourceAsStream("com/kehong/dbcp/db.properties"));
            // 数据库用户名
            String username = properties.getProperty("jdbc.username");
            // 数据库密码
            String password = properties.getProperty("jdbc.password");
            // 数据库连接
            String url = properties.getProperty("jdbc.url");
            // 数据库驱动
            String driver = properties.getProperty("jdbc.driver");
            // 初始化 连接池数量
            Integer initialSize = Integer.parseInt(properties.getProperty("dataSource.initialSize"));
            // 最大连接数
            Integer maxActive = Integer.parseInt(properties.getProperty("dataSource.maxActive"));
            // 最小空闲连接
            Integer minIdle = Integer.parseInt(properties.getProperty("dataSource.minIdle"));
            // 最大空闲连接
            Integer maxIdle = Integer.parseInt(properties.getProperty("dataSource.maxIdle"));
            // 连接超时时间 以毫秒为单位
            Integer maxWait = Integer.parseInt(properties.getProperty("dataSource.maxWait"));

            // 数据源 即获取或设置建立数据库连接的信息的对象，通过该对象可以从 DBCP 中获取连接 Connection
            dataSource = new BasicDataSource();

            dataSource.setInitialSize(initialSize);
            dataSource.setMaxActive(maxActive);
            dataSource.setMinIdle(minIdle);
            dataSource.setMaxIdle(maxIdle);
            dataSource.setMaxWait(maxWait);

            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            dataSource.setDriverClassName(driver);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接方法
     * @return
     */
    public static synchronized Connection getConn() {
        // 判断dataSource 是否为空，如果为空就调用init 方法 创建 dataSource 对象
        if (dataSource == null) {
            init();
        }

        Connection connection = null;
        try {
            // 从数据源中获取连接
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return connection;
    }
}
